home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
mcu
/
float09.arc
/
UTIL.SA
< prev
next >
Wrap
Text File
|
1987-03-04
|
7KB
|
315 lines
*
NAM UTIL
TTL UTILITARIAN ARITHMETIC SUPPORT ROUTINES
*
* DEFINE EXTERNAL REFERENCES
*
XDEF XSUBY,XADDY,NORMQK,NORM1,DNORM1,FPMOVE
XDEF VALID,FRCTAB,BITTBL,SHIFTR,COMP2,FILSKY
XDEF DENORM
*
XREF CKINVD,CHKOVF,CHKUNF,OVFLNT,UNFLNT,ROUND
XREF TFRACT,ADBIAS,SUBIAS,GOSET
*
*
* REVISION HISTORY:
* DATE PROGRAMMER REASON
*
* 23.MAY.80 G.WALKER ORIGINAL
* 1.JULY.80 G.WALKER REDUCE SIZE
* 14.JUL.80 G. STEVENS REDUCE SIZE AND
* ADD COMP2 ROUTINE
* 30.JUL.80 G. WALKER CORRECT 'VALID' SO 'SUBIAS'
* DOES NOT TRIGGER OVF TEST
* 06.AUG.80 G. WALKER 'VALID': POINT X TO RSLT FOR ROUND
* 12.AUG.80 G. STEVENS ADD FILSKY & DENORM UTILITIES
* 06.OCT.80 G. STEVENS FIX ADDR. MODE ERROR IN FILSKY
* 09.OCT.80 G.WALKER FIX G-BYTE OFFSET BACK TO ORIG
* 12.DEC.80 G. STEVENS ADD CALL TO ROUND IN 'VALID'
* 19.DEC.80 G. WALKER CHANGE IFCC CS TO IFCC EQ
* IN DNORM1.
*
*
PAG
******************************************************
*
* TABLE OF FRACTION SIZES IN BYTES AND BITS.
*
FRCTAB FCB 4,7,9,4,7 PRECISION IN BYTES
BITTBL FCB 26,55,66,26,55 PRECISION IN BITS + GUARD BIT
*
*************************************************
*
* XSUBY --
* SUBTRACTS THE 9-BYTE FRACTION POINTED TO BY
* XREG FROM THE 9-BYTE FRACTION POINTED TO BY
* THE YREG. RESULT IS LEFT IN FRACTION POINTED BY
* THE XREG.
* BASHES D AND CC.
*
XSUBY EQU *
XSBTRY SUBTRACT 9 BYTES AT X FROM BYTES AT Y
RTS
*
*******************************************
*
* NORMQK --
* PERFORMS A QUICK, MULTI-BIT NORMALIZE
* ON THE INTERNAL FP NUMBER POINTED TO BY X.
* BASHES D AND CC.
*
NORMQK EQU *
LBSR TFRACT TEST FOR ZERO FRACTION
IFCC NE
NRMQA EQU *
IFTST (FRACT,X),GE,#0
CLRA
LSHIFT FRACT,X,9 SHIFT FRACTION LEFT ONE BIT
LDD EXP,X
SUBD #1 DECREMENT EXPONENT TO COMPENSATE
STD EXP,X FOR LEFT SHIFT OF FRACTION
BRA NRMQA
ENDIF
ENDIF FRACTION IS NOT ZERO
RTS
*
***************************************************
*
* NORM1 --
* NORMALIZES THE INTERNAL FP NUMBER POINTED TO
* BY THE X REGISTER ONE BIT TO THE LEFT ONLY.
* BASHES D AND CC.
*
NORM1 EQU *
CLRA CLEAR C BIT
LSHIFT FRACT,X,9
LDD EXP,X
SUBD #1
STD EXP,X
RTS
***************************************************
*
* DNORM1 --
* DENORMALIZES THE INTERNAL FP NUMBER POINTED
* TO BY THE X-REGISTER ONE BIT TO THE RIGHT.
* THE CARRY BIT IS SHIFTED INTO THE MSB AND
* THE EXPONENT IS INCREMENTED TO MAINTAIN THE
* NUMBER UNCHANGED IN VALUE.
*
DNORM1 EQU *
RSHIFT FRACT,X,9
INC EXP+1,X
IFCC EQ IF CARRY OUT,
INC EXP,X PROPAGATE IT.
ENDIF
RTS
**************************************************
*
* XADDY --
* ADDS MANTISSA (9 BYTES LONG) POINTED TO
* BY X-REGISTER TO MANTISSA POINTED TO BY Y-REGISTER
* AND REPLACES X-MANTISSA WITH RESULT. THE CARRY
* OUT OF THE HIGH-ORDER BYTE OF RESULT IS LEFT
* IN THE CARRY FLAG OF THE CC-REGISTER.
* BASHES: D AND CC.
*
XADDY EQU *
XPLUSY ADD 9 BYTES AT X TO BYTES AT Y
RTS
*****************************************************
*
* VALID --
* VALIDATES THE FLOATING-POINT RESULT AND
* CALLS THE APPROPRIATE EXCEPTION-HANDLING
* ROUTINES, IF NECESSARY.
*
VALID EQU *
LBSR CHKUNF
IFCC EQ IF UNDERFLOW
LDX PFPCB,U
LDA ENB,X
ANDA #ENBUNF
IFCC NE IF ENABLED
LBSR ADBIAS
LBSR ROUND DELIVER ROUNDED RESULT TO TRAP HANDLER
ELSE
LBSR UNFLNT
ENDIF
ELSE ROUND AND CHECK FOR OVERFLOW
LEAX RESULT,U POINT X TO RESULT
LBSR ROUND ROUND RESULT
LBSR CKINVD CHECK FOR INVALID
LBSR CHKOVF
IFCC EQ IF OVERFLOW
LDX PFPCB,U
LDA ENB,X
ANDA #ENBOVF
IFCC NE**************************
*
* FPMOVE --
* MOVES A FLOATING-POINT NUMBER POINTED TO
* BY XREG TO THE MEMORY POINTED TO BY YREG. NO
* LOOP IS USED, SO IT IS VERY FAST.
*
* ON EXIT: NO REGISTERS CHANGED.
*
FPMOVE EQU *
PSHS CC,D
LDD 0,X MOVE OVER 2 BYTES AT A TIME
STD 0,Y
LDD 2,X
STD 2,Y
LDD 4,X
STD 4,Y
LDD 6,X
STD 6,Y
LDD 8,X
STD 8,Y
LDD 10,X
STD 10,Y
LDA 12,X
STA 12,Y
PULS CC,D,PC RESTORE REGS AND RETURN
*
******************************************************
*
* SHIFTR --
* THIS SUBROUTINE TAKES THE PLACE OF THE 9-BYTE
* RIGHT SHIFT MACRO WHERE SPACE IS CRITICAL AND
* TIME IS NOT.
*
SHIFTR EQU *
RSHIFT 0,X,9
RTS
*
********************************************************
*
* COMP2 --
* PREFORMS A TWO'S COMPLEMENT ON THE VALUE
* POINTED AT BY THE X-REG. WHOSE LEAST SIGNIFICANT
* BYTE IS GIVEN BY THE OFFSET IN THE B-REG.
*
COMP2 EQU *
*
TFR B,A SAVE OFFSET FOR FUTURE
WHILE A,GE,#0
COM A,X
DECA
*
ENDWH
*
LDA #01
WHILE B,GE,#0
IFTST A,NE
ADDA B,X
STA B,X
LDA #00
ROLA
*
ELSE
LDB #$FF
*
ENDIF
DECB
ENDWH
*
RTS RETURN
*
*
****************************************************
*
* PROCEDURE FILSKY
*
* OR'S ALL BITS IN THE FRACTION AND G-BIT INTO
* THE STIKY BYTE. ALSO ZEROS OUT THE FRACTION AND THE
* GUARD BIT.
*
* ON ENTRY: X - POINTS AT THE STACK FRAME ARGUMENT
*
* ON EXIT: X,Y,D,CC,U,S - UNCHANGED
*
FILSKY EQU *
*
PSHS X,Y,D,CC SAVE CALLERS REGISTERS
*
* GET OFFSET TO THE G-BYTE
*
LEAY GOSET,PCR G - OFFSET TABLE
LDB RPREC,U PRECISION INDEX
LSRB HALVE OFFSET
LDA B,Y OFFSET FROM FRACT
ADDA #FRACT OFFSET FROM SIGN
*
* START ORING THE BYTES OF FRACTION AND G-BIT INTO STIKY
* NOTE THAT THE ROUND BITS IN THE SAME BYTE AS THE G BYTE
* GET ORED AND ZEROED OUT AS WELL.
*
CLRB STIKY ACCUMULATOR
WHILE A,GE,#FRACT
ORB A,X
CLR A,X
DECA
*
ENDWH
*
ORB STIKY,U MODIFY STIKY
STB STIKY,U
*
*
PULS X,Y,D,CC,PC RETURN
*
*
*********************************************************
*
* PROCEDURE DENORM
*
* DENORMALIZES A FLOATING PT. FRACTION AND ORS THE
* BITS THAT FALL OFF THE END AS WELL AS THOSE BEYOND
* THE PROCISION OF FLOATING VALUE INTO THE STIKY BYTE.
* THE SHIFT COUNT FOR DENORMALIZING IS PASSED IN THE
* B - REG. .
*
* ON ENTRY: X - POINTS TO THE STACK FRAME ARGUMENT
* B - CONTAINS THE SHIFT COUNT
*
* ON EXIT: X,Y,D,CC,U,S - UNCHANGED
*
DENORM EQU *
*
PSHS X,Y,D,CC
*
CLRA STIKY ACCUMULATOR
WHILE B,GT,#00
ANDCC #NC CLEAR CARRY
RSHIFT FRACT,X,9 DO THE SHIFT
*
IFCC CS IF CARRY SET
ROLA
ENDIF
*
DECB
*
ENDWH
*
* OR ALL BYTES BEYOND THE GUARD BYTE INTO THE
* STIKY BYTE.
*
LEAY GOSET,PCR G - BYTE OFFSET TABLE
LDB RPREC,U GET PRECISION
LSRB HALVE OFFSET
LDB B,Y G- BYTE OFFSET
ADDB #FRACT+1 ADJUST OFFSET FOR FRACT
*
WHILE B,LT,#(ARGSIZ-1)
ORA B,X
INCB
*
ENDWH
*
ORA STIKY,U
STA STIKY,U
*
*
PULS X,Y,D,CC,PC
*